home *** CD-ROM | disk | FTP | other *** search
- #include <math.h>
- #include <proto/exec.h>
- #include <proto/intuition.h>
- #include <proto/dos.h>
- #include <proto/asl.h>
- #include <dos/dos.h>
- #include <libraries/asl.h>
- #include <intuition/intuition.h>
-
- #include "global.h"
- #include "model.h"
- #include "load.h"
- #include "App.bh"
- #include "Mainwin.bh"
- #include "View.bh"
-
- #define fract(n) (n - floor(n))
-
- static __saveds __asm void IntuiMsgFunc(register __a1 struct IntuiMessage *,register __a2 struct FileRequester *);
- static char *getfilename(Object *,char *,char *,char *,char);
-
- cleardata Method Mainwin::Mainwin():
- MUIA_Window_Title, "Geotto",
- MUIA_Window_ID, MAKE_ID('M','A','I','N'),
- MUIA_Window_NeedsMouseObject, TRUE,
- /*
- MUIA_Window_CloseGadget, FALSE,
- MUIA_Window_DepthGadget, FALSE,
- MUIA_Window_DragBar, FALSE,
- MUIA_Window_Backdrop, TRUE,
- MUIA_Window_Borderless, TRUE,
- */
- WindowContents, VGroup,
- Child, HGroup,
- Child, VGroup,
- MUIA_Weight, 0,
- Child, SimpleButton("About"),
- Child, newobj = KeyButton("New",'n'),
- Child, TextObject,
- MUIA_Text_Contents, "Fetch",
- End,
- Child, loadobj = KeyButton("Load",'l'),
- Child, KeyButton("Save",'s'),
- Child, KeyButton("Save As",'s'),
- Child, TextObject,
- MUIA_Text_Contents, "Zoom",
- End,
- Child, zoomin = KeyButton("In",'+'),
- Child, zoomout = KeyButton("Out",'-'),
- Child, HVSpace,
- Child, VGroup,
- TextFrame,
- MUIA_Background, MUII_TextBack,
- Child, xcoordtxt = TextObject, End,
- Child, ycoordtxt = TextObject, End,
- Child, zcoordtxt = TextObject, End,
- End,
- End,
- Child, viewgr = ColGroup(2),
- MUIA_Group_HorizSpacing, 1,
- MUIA_Group_VertSpacing, 1,
- Child, view1 = ViewObject,
- VirtualFrame,
- MUIA_View_Mode, MUIV_View_Mode_Top,
- MUIA_View_X, f2l(0.0),
- MUIA_View_Y, f2l(0.0),
- MUIA_View_Z, f2l(0.0),
- MUIA_View_Zoom, f2l(0.1),
- MUIA_View_GridSize, f2l(1.0),
- End,
- Child, view2 = ViewObject,
- VirtualFrame,
- MUIA_View_Mode, MUIV_View_Mode_Persp,
- MUIA_View_X, f2l(0.0),
- MUIA_View_Y, f2l(0.0),
- MUIA_View_Z, f2l(0.0),
- MUIA_View_Zoom, f2l(0.1),
- MUIA_View_GridSize, f2l(1.0),
- End,
- Child, view3 = ViewObject,
- VirtualFrame,
- MUIA_View_Mode, MUIV_View_Mode_Face,
- MUIA_View_X, f2l(0.0),
- MUIA_View_Y, f2l(0.0),
- MUIA_View_Z, f2l(0.0),
- MUIA_View_Zoom, f2l(0.1),
- MUIA_View_GridSize, f2l(1.0),
- End,
- Child, view4 = ViewObject,
- VirtualFrame,
- MUIA_View_Mode, MUIV_View_Mode_Left,
- MUIA_View_X, f2l(0.0),
- MUIA_View_Y, f2l(0.0),
- MUIA_View_Z, f2l(0.0),
- MUIA_View_Zoom, f2l(0.1),
- MUIA_View_GridSize, f2l(1.0),
- End,
- End,
- End,
- Child, HGroup,
- Child, gridsizetxt = TextObject,
- TextFrame,
- MUIA_Background, MUII_TextBack,
- MUIA_Text_Contents, "Grid:",
- End,
- Child, poks = SimpleButton("MUI Settings..."),
- End,
- End
- {
- obj->Zoom = 0.1;
-
- poks->_Notify(MUIA_Pressed,FALSE,MUIV_Notify_Application,2,MUIM_Application_OpenConfigWindow,0);
-
- newobj->_Notify(MUIA_Pressed,FALSE,obj,1,MUIM_Mainwin_New);
- loadobj->_Notify(MUIA_Pressed,FALSE,obj,1,MUIM_Mainwin_Load);
-
- zoomin->_Notify(MUIA_Pressed,FALSE,obj,1,MUIM_Mainwin_ZoomIn);
- zoomout->_Notify(MUIA_Pressed,FALSE,obj,1,MUIM_Mainwin_ZoomOut);
-
- ehnode.ehn_Priority = 0;
- ehnode.ehn_Flags = 0;
- ehnode.ehn_Object = obj;
- ehnode.ehn_Class = NULL;
- ehnode.ehn_Events = IDCMP_RAWKEY | IDCMP_MOUSEMOVE;
-
- obj->Window_AddEventHandler(&ehnode);
-
- objreq = MUI_AllocAslRequestTags(ASL_FileRequest,
- ASLFR_InitialDrawer, "3D:",
- ASLFR_InitialPattern, "#?.(lwo|img)",
- ASLFR_DoPatterns, TRUE,
- ASLFR_RejectIcons, TRUE,
- TAG_DONE);
-
- Model = AllocModel();
-
- /* {
- vertex_t *v[8];
- polygon_t *p;
-
- v[0] = AddVertex(Model); v[0]->x = -1.0; v[0]->y = 1.0; v[0]->z = 1.0;
- v[1] = AddVertex(Model); v[1]->x = 1.0; v[1]->y = 1.0; v[1]->z = 1.0;
- v[2] = AddVertex(Model); v[2]->x = -1.0; v[2]->y = -1.0; v[2]->z = 1.0;
- v[3] = AddVertex(Model); v[3]->x = 1.0; v[3]->y = -1.0; v[3]->z = 1.0;
- v[4] = AddVertex(Model); v[4]->x = -1.0; v[4]->y = 1.0; v[4]->z = -1.0;
- v[5] = AddVertex(Model); v[5]->x = 1.0; v[5]->y = 1.0; v[5]->z = -1.0;
- v[6] = AddVertex(Model); v[6]->x = -1.0; v[6]->y = -1.0; v[6]->z = -1.0;
- v[7] = AddVertex(Model); v[7]->x = 1.0; v[7]->y = -1.0; v[7]->z = -1.0;
-
- p = AddPolygon(Model); AddPolyvert(p,v[0]); AddPolyvert(p,v[1]); AddPolyvert(p,v[3]); AddPolyvert(p,v[2]);
- p = AddPolygon(Model); AddPolyvert(p,v[4]); AddPolyvert(p,v[5]); AddPolyvert(p,v[7]); AddPolyvert(p,v[6]);
- p = AddPolygon(Model); AddPolyvert(p,v[0]); AddPolyvert(p,v[1]); AddPolyvert(p,v[5]); AddPolyvert(p,v[4]);
- p = AddPolygon(Model); AddPolyvert(p,v[2]); AddPolyvert(p,v[3]); AddPolyvert(p,v[7]); AddPolyvert(p,v[6]);
- }
- */
- //LoadModel("CC:Lambda/orig/freighter.lwo",Model);
- //LoadModel("CC:Lambda/orig/mfighter2.img",Model);
-
- viewgr->View_Model = Model;
- }
-
- super Method Mainwin::OM_DISPOSE()
- {
- obj->Window_RemEventHandler(&ehnode);
- MUI_FreeAslRequest(objreq);
-
- FreeModel(Model);
- }
-
- super Method Mainwin::MUIM_HandleEvent()
- {
- Object *mouseobj = (Object *)obj->Window_MouseObject;
-
- if (msg->imsg)
- {
- if (mouseobj == view1)
- {
- switch(msg->imsg->Class)
- {
- case IDCMP_RAWKEY:
- switch(msg->imsg->Code)
- {
- case 76:
- viewgr->View_ScrollZPos();
- mreturn MUI_EventHandlerRC_Eat;
- break;
- case 77:
- viewgr->View_ScrollZNeg();
- mreturn MUI_EventHandlerRC_Eat;
- break;
- case 79:
- viewgr->View_ScrollXPos();
- mreturn MUI_EventHandlerRC_Eat;
- break;
- case 78:
- viewgr->View_ScrollXNeg();
- mreturn MUI_EventHandlerRC_Eat;
- break;
- }
- break;
- case IDCMP_MOUSEMOVE:
- xcoordtxt->Contents = "X 0.0 m";
- ycoordtxt->Contents = NULL;
- zcoordtxt->Contents = "Z 0.0 m";
- break;
- }
- }
- else if (mouseobj == view3)
- {
- switch(msg->imsg->Class)
- {
- case IDCMP_RAWKEY:
- switch(msg->imsg->Code)
- {
- case 76:
- viewgr->View_ScrollYPos();
- mreturn MUI_EventHandlerRC_Eat;
- break;
- case 77:
- viewgr->View_ScrollYNeg();
- mreturn MUI_EventHandlerRC_Eat;
- break;
- case 79:
- viewgr->View_ScrollXPos();
- mreturn MUI_EventHandlerRC_Eat;
- break;
- case 78:
- viewgr->View_ScrollXNeg();
- mreturn MUI_EventHandlerRC_Eat;
- break;
- }
- break;
- case IDCMP_MOUSEMOVE:
- xcoordtxt->Contents = "X 0.0 m";
- ycoordtxt->Contents = "Y 0.0 m";
- zcoordtxt->Contents = NULL;
- break;
- }
- }
- else if (mouseobj == view4)
- {
- switch(msg->imsg->Class)
- {
- case IDCMP_RAWKEY:
- switch(msg->imsg->Code)
- {
- case 76:
- viewgr->View_ScrollYPos();
- mreturn MUI_EventHandlerRC_Eat;
- break;
- case 77:
- viewgr->View_ScrollYNeg();
- mreturn MUI_EventHandlerRC_Eat;
- break;
- case 79:
- viewgr->View_ScrollZNeg();
- mreturn MUI_EventHandlerRC_Eat;
- break;
- case 78:
- viewgr->View_ScrollZPos();
- mreturn MUI_EventHandlerRC_Eat;
- break;
- }
- break;
- case IDCMP_MOUSEMOVE:
- xcoordtxt->Contents = NULL;
- ycoordtxt->Contents = "Y 0.0 m";
- zcoordtxt->Contents = "Z 0.0 m";
- break;
- }
- }
- else
- {
- if (msg->imsg->Class == IDCMP_MOUSEMOVE)
- {
- xcoordtxt->Contents = NULL;
- ycoordtxt->Contents = NULL;
- zcoordtxt->Contents = NULL;
- }
- }
- }
-
- mreturn 0;
- }
-
- Method Mainwin::New()
- {
- RemAllVertices(Model);
- MUI_Redraw(viewgr,MADF_DRAWOBJECT);
- }
-
- static __saveds __asm void IntuiMsgFunc(register __a1 struct IntuiMessage *imsg,register __a2 struct FileRequester *req)
- {
- if (imsg->Class == IDCMP_REFRESHWINDOW)
- DoMethod(req->fr_UserData,MUIM_Application_CheckRefresh);
- }
-
- Method Mainwin::Load()
- {
- static char buf[512];
- static const struct Hook IntuiMsgHook = { { 0,0 },(void *)IntuiMsgFunc,NULL,NULL };
- Object *app = (Object *)obj->_ApplicationObject;
-
- set(app,MUIA_Application_Sleep,TRUE);
- if (MUI_AslRequestTags(objreq,
- ASLFR_Window, obj->Window_Window,
- ASLFR_TitleText, "Load an object",
- ASLFR_DoSaveMode, FALSE,
- ASLFR_UserData, app,
- ASLFR_IntuiMsgFunc, &IntuiMsgHook,
- TAG_DONE,0))
- {
- if (*objreq->fr_File)
- {
- stccpy(buf,objreq->fr_Drawer,sizeof(buf));
- AddPart(buf,objreq->fr_File,sizeof(buf));
-
- LoadModel(buf,Model);
- MUI_Redraw(viewgr,MADF_DRAWOBJECT);
- }
- }
- set(app,MUIA_Application_Sleep,FALSE);
- }
-
- static char *getfilename(Object *win,char *title,char *dir,char *pattern,char save)
- {
- static char buf[512];
- struct FileRequester *req;
- struct Window *w;
- static long left=-1,top=-1,width=-1,height=-1;
- Object *app = (Object *)BCC_XGet(win,MUIA_ApplicationObject);
- char *res = NULL;
- static const struct Hook IntuiMsgHook = { { 0,0 },(VOID *)IntuiMsgFunc,NULL,NULL };
-
- get(win,MUIA_Window_Window,&w);
- if (left==-1)
- {
- left = w->LeftEdge+w->BorderLeft+2;
- top = w->TopEdge+w->BorderTop+2;
- width = w->Width-w->BorderLeft-w->BorderRight-4;
- height = w->Height-w->BorderTop-w->BorderBottom-4;
- }
-
- if (req=MUI_AllocAslRequestTags(ASL_FileRequest,
- ASLFR_Window, w,
- ASLFR_TitleText, title,
- ASLFR_InitialLeftEdge, left,
- ASLFR_InitialTopEdge , top,
- ASLFR_InitialWidth , width,
- ASLFR_InitialHeight , height,
- ASLFR_InitialDrawer , dir,
- ASLFR_InitialPattern , pattern,
- ASLFR_DoSaveMode , save,
- ASLFR_DoPatterns , TRUE,
- ASLFR_RejectIcons , TRUE,
- ASLFR_UserData , app,
- ASLFR_IntuiMsgFunc , &IntuiMsgHook,
- TAG_DONE))
- {
- set(app,MUIA_Application_Sleep,TRUE);
- if (MUI_AslRequestTags(req,TAG_DONE))
- {
- if (*req->fr_File)
- {
- res = buf;
- stccpy(buf,req->fr_Drawer,sizeof(buf));
- AddPart(buf,req->fr_File,sizeof(buf));
- }
- left = req->fr_LeftEdge;
- top = req->fr_TopEdge;
- width = req->fr_Width;
- height = req->fr_Height;
- }
- MUI_FreeAslRequest(req);
- set(app,MUIA_Application_Sleep,FALSE);
- }
- return(res);
- }
-
- Method Mainwin::ZoomIn()
- {
- obj->Zoom = f2l(Zoom * 1.25);
- }
-
- Method Mainwin::ZoomOut()
- {
- obj->Zoom = f2l(Zoom / 1.25);
- }
-
- Attribute Mainwin::Zoom:S(long zoom)
- {
- char buf[64];
-
- Zoom = l2f(zoom);
-
- GridSize = pow(10.0,floor(log10(0.1 / Zoom)));
- if (fract(log10(1.0 / Zoom)) > 0.699) GridSize *= 5.0;
- else if (fract(log10(1.0 / Zoom)) > 0.301) GridSize *= 2.0;
-
- if (GridSize >= 1000000.0)
- sprintf(buf,"Grid: %d Mm",(long)(GridSize / 1000000.0));
- else if (GridSize >= 1000.0)
- sprintf(buf,"Grid: %d km",(long)(GridSize / 1000.0));
- else if (GridSize >= 1.0)
- sprintf(buf,"Grid: %d m",(long)GridSize);
- else if (GridSize >= 0.01)
- sprintf(buf,"Grid: %d cm",(long)(GridSize * 100.0));
- else
- sprintf(buf,"Grid: %d mm",(long)(GridSize * 1000.0));
-
- gridsizetxt->Contents = buf;
-
- viewgr->View_Zoom = f2l(Zoom);
- viewgr->View_GridSize = f2l(GridSize);
- MUI_Redraw(viewgr,MADF_DRAWOBJECT);
- }
-
-